#ifndef _CLIENTSOCKET_H
#define _CLIENTSOCKET_H

#define ID_SOCKCLIENT_EVENT_MSG		WM_USER + 1000

#include <assert.h>
#include <Windows.h>
//#include <WinSock2.h>
#include "../Net/Packet.h"


#pragma comment(lib, "WS2_32.lib")

class CClientSocket
{
protected:
	int					m_nCurRecv;
	//CHAR				m_szBuff[8192 * 4];				// For Receive

	char				m_szEncodeDefMsg[32];			// For Send
	char				m_szEncodeBody[8192];			
	char				m_szPacket[8192 * 2];

	int					m_nSync;

	//_TDEFAULTMESSAGE	DefMsg;

public:
	CClientSocket();
	virtual ~CClientSocket();

	SOCKET			m_sockClient;
	//CWHDefProcess*	m_pxDefProc;

public:
	unsigned long GetINetAddr(CHAR* pszDotAddress);

	BOOL		InitSocket(HWND hWnd);	
	BOOL		IsConnected();
	BOOL		ConnectToServer(HWND hWnd, CHAR* szID, INT nPort);
	BOOL		PreConnectToServer(HWND hWnd, CHAR* szID, INT nPort);
	BOOL		TimeoutServer();
	BOOL		CreateSocket();
	void		CloseSocket();
	BOOL		CheckSocketError(LPARAM lParam);
	BOOL		DisconnectToServer();
	VOID		SendToServer(PacketBase* _pPacket);
	UINT		SendToServer(const char* _pszData, unsigned int _uLen);
// 	VOID		SendPacket(_TDEFAULTMESSAGE* lpDefMsg, char *pszData);
// 
// 	// For Login
// 	VOID		OnLogin(char *pszID, char *pszPassword);
// 	VOID		OnSelectServer(char *pszServerName);
// 	VOID		OnChangePassword(char *pszID, char *pszOldPassword, char *pszNewPassword);
// 	VOID		OnNewAccount(char *pszNewAccount);
// 
// 	// For Character Select
// 	VOID		OnQueryChar();
// 	VOID		OnNewChar( char *pszId, int nHair, int nJob, int nSex );
// 	VOID		OnDelChar( char *pszCharName );
// 	VOID		OnSelChar( char *pszCharName );
// 
// 	// For Game playing
// 	void		SendNoticeOK();
// 
// 	void		SendNPCMessage(WORD wIdent,DWORD dwNpcId,INT reg,CHAR* szTxt);			// MOON
// 	void		SendGetDetailItem(DWORD dwNpcId,INT nIndex,CHAR* szItemName);			// MOON
// 	void		SendBuyItem(DWORD dwNpcId,CHAR* szItemName,CHAR* szItemIndex);			// MOON
// 
// 	VOID		SendOpenDoor(INT nX, INT nY, INT nIdx);
// 	VOID		SendQueryMsg(WORD wIdent);
// 	VOID		SendActMsg(WORD wIdent, INT nX, INT nY, INT nDir);	
// 	VOID		SendHitMsg(WORD wIdent, INT nX, INT nY, INT nDir, WORD wHitStyle);	
// 	VOID		SendRideMsg(WORD wIdent, INT nDir, BOOL bRide);
// 	VOID		SendSpellMsg(INT nMagicID, INT nTargetX, INT nTargetY, INT nTargetID);
// 	VOID		SendSay(CHAR *pszSay);
// 	VOID		SendRunLogin(CHAR* szLoginID, CHAR* szCharName, INT nCertification, INT VersionNum);
// 	VOID		SendTakeOnOffItem(WORD wIdent, BYTE bEquipNum, CHAR* szItemName, INT nItemIdx);
// 	VOID		SendQueryName(INT nRecog, INT nX, INT nY);
// 	VOID		SendMagicKeyChange(INT nKeyNum, INT nMagicID);
// 	VOID		SendItemIndex(WORD wIdent, INT nItemIndex, CHAR* pszItemName);
// 	VOID		SendPickUp(INT nX, INT nY);
// 	VOID		SendButchAnimal(INT nX, INT nY, INT nDir, INT nActorID);
// 	VOID		SendNPCClick(INT nRecog);
// 
// 	void		SendCreateGroup(char *pszWho);
// 	void		SendGroupMode(BOOL fFlag);
// 	void		SendAddGroupMember(char *pszWho);
// 	void		SendDelGroupMember(char *pszWho);
// 
// 	void		SendGuildHome();

	LRESULT		OnSocketMessage(WPARAM wParam, LPARAM lParam);

	SOCKET		GetSocket()				{return m_sockClient;}

protected:
};


extern CClientSocket g_xClientSocket;
extern CClientSocket g_xClientSocket2;
//extern CClientSocket g_xLoginSocket;
//extern CClientSocket g_xGameSocket;

#endif // _CLIENTSOCKET_H